package fr.miage.shopping.dao.traitements;

import fr.miage.shopping.metier.entite.Admin;
import fr.miage.shopping.metier.entite.Categorie;

import fr.miage.shopping.metier.entite.Client;
import fr.miage.shopping.metier.entite.Commande;
import fr.miage.shopping.metier.entite.Lignecommande;
import fr.miage.shopping.metier.entite.Produit;
import fr.miage.shopping.metier.entite.Role;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;


/**
 * @author kristela
 *
 */
public class CategorieDao {
	/**
	 * Retourne une session.
	 * 
	 * @return la session.
	 */
	public static Session getSession() {
		Configuration config = new Configuration();
		config.addClass(Client.class);
		config.addClass(Commande.class);
		config.addClass(Lignecommande.class);
		config.addClass(Produit.class);
		config.addClass(Admin.class);
		config.addClass(Categorie.class);
		config.addClass(Role.class);
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		return session;
	}

	/**
	 * Ajoute un nouveau client dans la base de donnees.
	 * 
	 * @param categorie
	 *            le admin a ajouter.
	 */
	public static void insertCategorie(Categorie categorie) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.saveOrUpdate(categorie);
            tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}


	
	/**
     * Sélectionner une catégorie
     * @param categorie
     * @return la catégorie
     */
	public static Categorie selectCategorie(Categorie categorie){
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Categorie cate=new Categorie();
		session.load(cate, categorie.getIdCate());
		session.close();
		session.getSessionFactory().close();
		return cate;
	}

	/**
	 * Renvoie la liste de touts les admins.
	 * 
	 * @return tous les admins.
	 */
	public static List<Categorie> selectAllCategorie() {
		List<Categorie> listCategorie = new ArrayList<Categorie>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		listCategorie=(List<Categorie>)(session.createQuery("select c from Categorie c").list());
		ArrayList<Categorie> lcat=new ArrayList<Categorie>();
		for (int i = 0; i < listCategorie.size(); i++) {
			Categorie c= listCategorie.get(i);
			lcat.add(c);
		}
		session.close();
		session.getSessionFactory().close();
		return lcat;
	}

    /**
     * Renvoie toutes les catégories triées par catégorie père
     * @return la liste des catégories
     */
    public static List<Categorie> selectAllCategorieTrie() {
		List<Categorie> listCategorie = new ArrayList<Categorie>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}

        Criteria criteria = session.createCriteria(Categorie.class);
		listCategorie = criteria.addOrder(Order.asc("categories")).list();
		
		session.close();
		session.getSessionFactory().close();
		return listCategorie;
	}
    public static List<Categorie> selectCategorieNiv1() {
		List<Categorie> listCategorie = new ArrayList<Categorie>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}

        Criteria criteria = session.createCriteria(Categorie.class);
        criteria.add(Expression.eq("categories", null));
        listCategorie = criteria.list();



		session.close();
		session.getSessionFactory().close();
		return listCategorie;
	}
	/**
	 * Effacer le compte epargne correspondant a un numero.
	 * 
	 * @param numero
	 *            le numero du compte.
	 */
	public static void deleteCategorie(Categorie categorie) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.delete(categorie);
		}
		session.close();
		session.getSessionFactory().close();
	}
	
	public static void updateCategorie(Categorie categorie) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.update(categorie);
		}
		session.close();
		session.getSessionFactory().close();
	}
	
	
	public static String getCategorieCritere(Categorie categorie){
		StringBuffer sql = new StringBuffer("SELECT FROM categorie WHERE idCate="+categorie.getIdCate()+" ");
		if (categorie.getNomCate()!=null) {
			sql.append("AND nomCate=\""+categorie.getNomCate()+"\" ");
		}
		if(categorie.getCategorie()!=null){
			sql.append("AND idCatePere="+categorie.getCategorie().getIdCate()+" ");
		}
		sql.append(";");
		return sql.toString();
	}	

	/**
	 * Renvoie la liste de touts les admins.
	 *
	 * @return tous les admins.
	 */
	public static List<Categorie> selectAllCategorieK() {
		List<Categorie> listCategorie = new ArrayList<Categorie>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		listCategorie=(List<Categorie>)(session.createQuery("select c from Categorie c").list());
		ArrayList<Categorie> lcat=new ArrayList<Categorie>();
		for (int i = 0; i < listCategorie.size(); i++) {
			Categorie c= listCategorie.get(i);
			lcat.add(c);
		}
		session.close();
		session.getSessionFactory().close();
		return lcat;
	}

    /**
     * Sélectionne une catégorie par son nom
     * @param categorie la catégorie à récupérer
     * @return la cétégorie
     */
    public static Categorie selectCategorieByNom(Categorie categorie){
        Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}

		Categorie cate=new Categorie();
        Object o = session.createQuery("Select c From Categorie c where nomCate='"+categorie.getNomCate()+"'").uniqueResult();
		cate =(Categorie)o;
		session.close();
		session.getSessionFactory().close();
		return cate;
    }

    
    /**
     * Sélectionner les catégories de niveaux 1
     * @return la liste de catégorie
     */
    public static List<Categorie> selectAllCategoriePere(){
    	List<Categorie> listCategories = new ArrayList<Categorie>();
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
       String hbm="Select c from Categorie c where idCatePere is NULL";
       listCategories=(List<Categorie>)session.createQuery(hbm).list();

        session.close();
		session.getSessionFactory().close();
		return listCategories;
	}
}
